//
//  HMSportMapVC.m
//  BlackHorseLine
//
//  Created by made on 17/3/5.
//  Copyright © 2017年 made. All rights reserved.
//

#import "HMSportMapVC.h"
#import <MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
#import "HMTransitionAnimation.h"
#import "HMSportPolyLine.h"
#import "HMSportMapModeVC.h"

@interface HMSportMapVC ()<MAMapViewDelegate,UIPopoverPresentationControllerDelegate>
//距离
@property (weak, nonatomic) IBOutlet UILabel *distanceLabel;
//时间
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
//运动起点的位置
@property(strong,nonatomic)CLLocation *startLocation;
//转场动画器
@property(nonatomic,strong)HMTransitionAnimation *animation;

@end

@implementation HMSportMapVC
- (void)awakeFromNib
{
    [super awakeFromNib];
    
    //1.设置转场样式为自定义
    self.modalPresentationStyle = UIModalPresentationCustom;
    //2.设置转场代理为动画器
    self.animation = [[HMTransitionAnimation alloc] init];
    self.transitioningDelegate = self.animation;
    
    //加载高德地图
    [self setupMAMapView];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置视图背景颜色
    //self.view.backgroundColor = [UIColor purpleColor];
}


- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
   
}

- (void)setupMAMapView {
    
    //1.创建高德地图
    MAMapView *mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    //2.添加使用insertSubview插入到父视图最底层,避免遮盖其他视图
    [self.view insertSubview:mapView atIndex:0];
    //3.隐藏比例尺
    mapView.showsScale = NO;
    //4.是否显示交通
    mapView.showTraffic = NO;
    //5.删除相机旋转(3D),可以降低能耗
    mapView.rotateCameraEnabled =NO;
    //6.是否显示用户位置
    mapView.showsUserLocation = YES;
    //7.跟踪用户位置
    mapView.userTrackingMode = MAUserTrackingModeFollowWithHeading;
    //7.1设置代理
    mapView.delegate = self;
    //8.允许后台定位 设置为YES的时候必须保证 Background Modes 中的 Location updates处于选中状态，否则会抛出异常。
    mapView.allowsBackgroundLocationUpdates = YES;
    //9.开启后台定位同时需要关闭系统自动停止更新开关
    mapView.pausesLocationUpdatesAutomatically = NO;
    
    self.mapView = mapView;
    
}


#pragma mark - MAMapViewDelegate

/**
 1.切换模拟器
 2.切换系统版本
 */

/**
 * @brief 位置或者设备方向更新后，会调用此函数
 * @param mapView 地图View
 * @param userLocation 用户定位信息(包括位置与设备方向等数据)
 * @param updatingLocation 标示是否是location数据更新, YES:location数据更新 NO:heading数据更新
 */
//当位置更新时，会进定位回调，通过回调函数，能获取到定位点的经纬度坐标
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
    //NSLog(@"%@",userLocation.location);
    
    //当位置更新的时候,设置用户当前位置在地图的中心
    [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
    //所有的地图框架(GPS)在刚启动的时候,位置的误差很大,前面几次是在校正数据,不参与算法/轨迹的绘制
    static int i = 0;
    if (i < 3)
    {
        i += 1;
        return;
    }
    
    //1.判断是否是位置更新,如果是位置之外的数据发送变化也会走该代理方法
    if (updatingLocation)
    {
        //判断没有起点位置时以及有运动起点的位置才添加起点大头针
        if (self.startLocation == nil && self.sportTracking.startLocation != nil)
        {
            //1.1创建大头针
            MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
            
            //设置大头针的位置为运动模型的起点位置
            pointAnnotation.coordinate = self.sportTracking.startLocation.coordinate;
            NSLog(@"%f====%f",pointAnnotation.coordinate.latitude,pointAnnotation.coordinate.longitude);
 
            [mapView addAnnotation:pointAnnotation];
            
            //1.2将大头针位置作为运动起点位置
            self.startLocation = userLocation.location;
        }
    }
    
    //绘制折线
    [mapView addOverlay:[self.sportTracking drawPolylineWithLocation:userLocation.location]];
    
    //送出代理
    if (self.delegate && [self.delegate respondsToSelector:@selector(HMsportMapVCDidUpdateLocation:mapVC:)])
    {
        [self.delegate HMsportMapVCDidUpdateLocation:self.sportTracking mapVC:self];
    }
    
    //刷新UI
    [self updateUI];
    
    //NSLog(@"%@",userLocation.location);
}



- (void) updateUI
{
    //距离
    self.distanceLabel.text = [NSString stringWithFormat:@"%.2f",self.sportTracking.totalDistance];
    //时间
    self.timeLabel.text = self.sportTracking.totaTimeStr;
}



/**
 * @brief 根据overlay生成对应的Renderer
 * @param mapView 地图View
 * @param overlay 指定的overlay
 * @return 生成的覆盖物Renderer
 */

- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id<MAOverlay>)overlay
{
    if ([overlay isKindOfClass:[MAPolyline class]])
    {
        //1.创建遮盖物渲染器
        MAPolylineRenderer *polylineRenderer = [[MAPolylineRenderer alloc] initWithPolyline:overlay];
        //强转为自定义折线模型
        HMSportPolyLine *polyline = (HMSportPolyLine *)overlay;
        //2.线条宽度
        polylineRenderer.lineWidth    = 5.f;
        //3.线条颜色
        polylineRenderer.strokeColor = polyline.lineColor;
        
        //高德地图mapview的可见区域
        NSLog(@"x:%f  y:%f  w:%f   h:%f",mapView.visibleMapRect.origin.x,mapView.visibleMapRect.origin.y,mapView.visibleMapRect.size.width,mapView.visibleMapRect.size.height);

        //        //输出遮盖物折线在视图上的位置
        //        NSLog(@"%@",NSStringFromCGPoint([mapView convertCoordinate:self.sportTracking.trackingLineArr[0].polyline.coordinate toPointToView:self.view]));

        
        return polylineRenderer;
    }
    return nil;
}



/**
 根据anntation生产对应的View

 @param mapView 地图View
 @param annotation 指定的标注
 @return 生成的标注View
 */
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        static NSString *reuseIndetifier = @"annotationReuseIndetifier";
        MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
        if (annotationView == nil)
        {
            annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIndetifier];
        }
        
        annotationView.image = self.sportTracking.sportImage;
        
        //设置中心点偏移,使得标注底部中间点成为经纬度对应点(避免遮盖系统默认大头针,偏移量应该是图片高度的一半)
        annotationView.centerOffset = CGPointMake(0, -self.sportTracking.sportImage.size.height/2);
        return annotationView;
        
    }
    return nil;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}


#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"HMSportMapModeVC"]) {
        //1.获取目标控制器
        HMSportMapModeVC *modeVC = (HMSportMapModeVC *)segue.destinationViewController;
        //2.如果目标控制器的跳转样式是popover,则可以通过popoverPresentationController属性获取popover控制器
        UIPopoverPresentationController *popoverVC = modeVC.popoverPresentationController;
        //3.设置popover的代理
        //默认情况下popover跳转在iPhone下会全屏显示,如果想要显示弹窗需要设置代理取消全屏自适应
        popoverVC.delegate = self;
        
        //4.设置popover的大小
        //当控制器有容器控制器时可以通过preferredContentSize来设置容器控制器的大小(改变popover的大小)
        //通过设置popover目标控制器的preferredContentSize来设置popoover的大小 如果某一个方向为0,则会根据内容进行自适应
        modeVC.preferredContentSize = CGSizeMake(0, 100);
        
        //5.设置popover的箭头方向
        popoverVC.permittedArrowDirections = UIPopoverArrowDirectionDown;
        
        //6.设置目标参考点(箭头的参考位置:矩形框的自身坐标系的中心点)
        //如果想让箭头指向目标视图的中心,可以设置popover的目标参考点为来源视图的bounds
        popoverVC.sourceRect = popoverVC.sourceView.bounds;
        
        //7.设置地图类型
        modeVC.mapType = self.mapView.mapType;
        modeVC.modeButtonClickBlock = ^(NSInteger index)
        {
            self.mapView.mapType = index-1;
        };
        
    }

}





#pragma mark - UIPopoverPresentationControllerDelegate

//UIPopoverPresentationControllerDelegate也实现了UIAdaptivePresentationControllerDelegate协议
//返回popober的自适应样式

//默认返回UIModalPresentationFullScreen全屏,如果是iPhone想要显示popover弹窗效果,则需要在该代理中取消全屏自适应UIModalPresentationNone
//改代理方法只对iPhone
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}





@end
